/**
 * 日期格式化工具类
 */

/**
 * 格式化日期为指定格式
 * @param {Date|string|number} date - 日期对象、日期字符串或时间戳
 * @param {string} format - 格式化模板，支持以下占位符：
 *   - YYYY: 4位年份
 *   - YY: 2位年份
 *   - MM: 2位月份（01-12）
 *   - M: 月份（1-12）
 *   - DD: 2位日期（01-31）
 *   - D: 日期（1-31）
 *   - HH: 2位小时（00-23）
 *   - H: 小时（0-23）
 *   - mm: 2位分钟（00-59）
 *   - m: 分钟（0-59）
 *   - ss: 2位秒数（00-59）
 *   - s: 秒数（0-59）
 *   - SSS: 3位毫秒（000-999）
 * @returns {string} 格式化后的日期字符串
 */
export function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
  if (!date) return ''
  
  const d = new Date(date)
  if (isNaN(d.getTime())) return ''
  
  const year = d.getFullYear()
  const month = d.getMonth() + 1
  const day = d.getDate()
  const hour = d.getHours()
  const minute = d.getMinutes()
  const second = d.getSeconds()
  const millisecond = d.getMilliseconds()
  
  return format
    .replace(/YYYY/g, year)
    .replace(/YY/g, String(year).slice(-2))
    .replace(/MM/g, String(month).padStart(2, '0'))
    .replace(/M/g, month)
    .replace(/DD/g, String(day).padStart(2, '0'))
    .replace(/D/g, day)
    .replace(/HH/g, String(hour).padStart(2, '0'))
    .replace(/H/g, hour)
    .replace(/mm/g, String(minute).padStart(2, '0'))
    .replace(/m/g, minute)
    .replace(/ss/g, String(second).padStart(2, '0'))
    .replace(/s/g, second)
    .replace(/SSS/g, String(millisecond).padStart(3, '0'))
}

/**
 * 格式化日期为相对时间（如：刚刚、5分钟前、1小时前等）
 * @param {Date|string|number} date - 日期对象、日期字符串或时间戳
 * @returns {string} 相对时间字符串
 */
export function formatRelativeTime(date) {
  if (!date) return ''
  
  const d = new Date(date)
  if (isNaN(d.getTime())) return ''
  
  const now = new Date()
  const diff = now.getTime() - d.getTime()
  const diffMinutes = Math.floor(diff / (1000 * 60))
  const diffHours = Math.floor(diff / (1000 * 60 * 60))
  const diffDays = Math.floor(diff / (1000 * 60 * 60 * 24))
  const diffMonths = Math.floor(diffDays / 30)
  const diffYears = Math.floor(diffDays / 365)
  
  if (diffMinutes < 1) return '刚刚'
  if (diffMinutes < 60) return `${diffMinutes}分钟前`
  if (diffHours < 24) return `${diffHours}小时前`
  if (diffDays < 30) return `${diffDays}天前`
  if (diffMonths < 12) return `${diffMonths}个月前`
  return `${diffYears}年前`
}

/**
 * 格式化日期为中文格式（如：2024年1月1日 12:30:45）
 * @param {Date|string|number} date - 日期对象、日期字符串或时间戳
 * @param {boolean} includeTime - 是否包含时间部分
 * @returns {string} 中文格式的日期字符串
 */
export function formatChineseDate(date, includeTime = true) {
  if (!date) return ''
  
  const d = new Date(date)
  if (isNaN(d.getTime())) return ''
  
  const year = d.getFullYear()
  const month = d.getMonth() + 1
  const day = d.getDate()
  const hour = d.getHours()
  const minute = d.getMinutes()
  const second = d.getSeconds()
  
  let result = `${year}年${month}月${day}日`
  
  if (includeTime) {
    result += ` ${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}`
  }
  
  return result
}

/**
 * 格式化日期为简短格式（如：01-01 12:30）
 * @param {Date|string|number} date - 日期对象、日期字符串或时间戳
 * @param {boolean} includeTime - 是否包含时间部分
 * @returns {string} 简短格式的日期字符串
 */
export function formatShortDate(date, includeTime = true) {
  if (!date) return ''
  
  const d = new Date(date)
  if (isNaN(d.getTime())) return ''
  
  const month = d.getMonth() + 1
  const day = d.getDate()
  const hour = d.getHours()
  const minute = d.getMinutes()
  
  let result = `${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`
  
  if (includeTime) {
    result += ` ${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`
  }
  
  return result
}

/**
 * 格式化日期为本地化格式（如：2024/1/1 12:30:45）
 * @param {Date|string|number} date - 日期对象、日期字符串或时间戳
 * @returns {string} 本地化格式的日期字符串
 */
export function formatLocalDate(date) {
  if (!date) return ''
  
  const d = new Date(date)
  if (isNaN(d.getTime())) return ''
  
  return d.toLocaleDateString() + ' ' + d.toLocaleTimeString()
}

/**
 * 获取日期是星期几
 * @param {Date|string|number} date - 日期对象、日期字符串或时间戳
 * @param {boolean} short - 是否返回简短格式（如：周一）
 * @returns {string} 星期几
 */
export function getWeekday(date, short = false) {
  if (!date) return ''
  
  const d = new Date(date)
  if (isNaN(d.getTime())) return ''
  
  const weekdays = ['日', '一', '二', '三', '四', '五', '六']
  const weekday = d.getDay()
  
  return short ? `周${weekdays[weekday]}` : `星期${weekdays[weekday]}`
}

/**
 * 判断是否为今天
 * @param {Date|string|number} date - 日期对象、日期字符串或时间戳
 * @returns {boolean} 是否为今天
 */
export function isToday(date) {
  if (!date) return false
  
  const d = new Date(date)
  if (isNaN(d.getTime())) return false
  
  const today = new Date()
  return d.toDateString() === today.toDateString()
}

/**
 * 判断是否为昨天
 * @param {Date|string|number} date - 日期对象、日期字符串或时间戳
 * @returns {boolean} 是否为昨天
 */
export function isYesterday(date) {
  if (!date) return false
  
  const d = new Date(date)
  if (isNaN(d.getTime())) return false
  
  const yesterday = new Date()
  yesterday.setDate(yesterday.getDate() - 1)
  return d.toDateString() === yesterday.toDateString()
}

/**
 * 智能格式化日期（根据时间远近选择合适的格式）
 * @param {Date|string|number} date - 日期对象、日期字符串或时间戳
 * @returns {string} 智能格式化的日期字符串
 */
export function formatSmartDate(date) {
  if (!date) return ''
  
  const d = new Date(date)
  if (isNaN(d.getTime())) return ''
  
  if (isToday(d)) {
    return formatDate(d, 'HH:mm')
  } else if (isYesterday(d)) {
    return `昨天 ${formatDate(d, 'HH:mm')}`
  } else {
    const now = new Date()
    const diffDays = Math.floor((now.getTime() - d.getTime()) / (1000 * 60 * 60 * 24))
    
    if (diffDays < 7) {
      return `${getWeekday(d, true)} ${formatDate(d, 'HH:mm')}`
    } else if (d.getFullYear() === now.getFullYear()) {
      return formatShortDate(d, true)
    } else {
      return formatDate(d, 'YYYY-MM-DD HH:mm')
    }
  }
}

// 默认导出所有方法
export default {
  formatDate,
  formatRelativeTime,
  formatChineseDate,
  formatShortDate,
  formatLocalDate,
  getWeekday,
  isToday,
  isYesterday,
  formatSmartDate
}
